var vsLightsContent =
    
      'attribute vec3 aVertexPosition; \n'
    + 'attribute vec3 aVertexNormal; \n'
    
    + '\n'
    
    // Matrices
    + 'uniform mat4 uMVMatrix; \n'
    + 'uniform mat4 uPMatrix; \n'
    + 'uniform mat4 uNMatrix; \n'
    + 'uniform mat4 uViewMatrix; \n'
    
    + '\n'
    
    // Ambient light
    + 'uniform vec3 uAmbientColor; \n'
    
    // Directional light
    + 'uniform vec3 uDirectionalLightColor; \n'
    + 'uniform vec3 uDirectionalLightDirection; \n'
    
    // Material
    + 'uniform vec3 uKe; \n'
    + 'uniform vec3 uKa; \n'
    + 'uniform vec3 uKd; \n'
    + 'uniform vec3 uKs; \n'
    + 'uniform float uAlpha; \n'
    
    + '\n'
    
    // Vertex color
    + 'varying vec4 vColor; \n'
    
    + '\n'
    
    + 'void main( void ) { \n'
    
        // Model -> View
        + '\t vec4 eyeSpacePosition = uMVMatrix * vec4( aVertexPosition, 1.0 ); \n'

        // View -> Screen
        + '\t gl_Position = uPMatrix * eyeSpacePosition; \n'
        
        // Compute diffuse term
        + '\t vec3 eyeSpaceNormal = vec3( uNMatrix * vec4( aVertexNormal, 0.0 ) ); \n'
        + '\t vec3 eyeSpaceLightDir = vec3( uViewMatrix * vec4( normalize( uDirectionalLightDirection ), 0.0 ) ); \n'
        + '\t float diffuseLight = max( dot( eyeSpaceLightDir, eyeSpaceNormal ), 0.0 ); \n'
        + '\t vec3 diffuse = uKd * uDirectionalLightColor * diffuseLight; \n'

        // Compute emissive term
        + '\t vec3 emissive = uKe; \n'

        // Compute ambiant term
        + '\t vec3 ambient = uKa * uAmbientColor ; \n'

        // Compute specular term
        + '\t vec3 specular = uKs * vec3( 1.0, 1.0, 1.0 ) * 0.0; \n'

        // Compute vertex color
        + '\t vColor = clamp( vec4( ambient + diffuse, uAlpha ), 0.0, 1.0 ); \n'
    
    + '}';